package sanshi.contect.chinaOofresp;

import java.util.ArrayList;
import java.util.List;

/**
 * 责任链模式
 *
 * 使用FilterChina与ArrayList的区别：
 * 当实现Filter接口之后，FilterChina可以将其他的FilterChina添加在现有的FilterChina上。
 */
public class Main {
    public static void main(String[] args) {
        Msg msg = new Msg();
        msg.setMsg("大家好：<script>，欢迎访问sanshi.ltd, 上班的时间996");

        //方法一。将String获取到，然后在使用replace()
//        String r = msg.getMsg();
//        r = r.replace('<', '[');
//        r = r.replace('>', ']');

        //用户可以指定替换的内容
//        msg = new HTMLFilter().doFilter(msg, '<', '[');
//        msg = new HTMLFilter().doFilter(msg, '>', ']');
//        msg = new SensitiveFilter().doFilter(msg, "996", "955");

        //使用责任链模式：将内容进行不断的过滤
//        List<Filter> list = new ArrayList<>();
//        list.add(new HTMLFilter());
//        list.add(new SensitiveFilter());
//        for (Filter filter : list){
//            filter.doFilter(msg);
//        }
//        System.out.println(msg);

//        System.out.println(msg);

        //使用责任链模式
        FilterChina china = new FilterChina();
        china.add(new HTMLFilter()).add(new SensitiveFilter());

        FilterChina china1 = new FilterChina();
        china1.add(new FaceFilter()).add(new URLFilter());

        china.add(china1);
        china.doFilter(msg);
        System.out.println(msg);



    }

}

class Msg{
    String name;
    String msg;


    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    @Override
    public String toString() {
        return "Msg{" +
                "msg='" + msg + '\'' +
                '}';
    }
}

interface Filter{

    default Msg doFilter(Msg msg, char oldChar, char newChar){return null;}
    default Msg doFilter(Msg msg, String oldChar, String newChar){return null;}

    default boolean doFilter(Msg msg) {return true;}
}

class HTMLFilter implements Filter{

    @Override
    public Msg doFilter(Msg msg, char oldChar, char newChar) {
        String r = msg.getMsg();
        msg.setMsg(r.replace(oldChar, newChar));
        return msg;
    }

    @Override
    public boolean doFilter(Msg msg) {
        String s = msg.getMsg();
        msg.setMsg(s.replace('<', '['));
        msg.setMsg(msg.getMsg().replace('>', ']'));
        return true;
    }
}
class SensitiveFilter implements Filter{

    @Override
    public Msg doFilter(Msg msg, String oldStr, String newStr) {
        String r = msg.getMsg();
        msg.setMsg(r.replace(oldStr, newStr));
        return msg;
    }

    @Override
    public boolean doFilter(Msg msg) {
        msg.setMsg(msg.getMsg().replace("996", "955"));
        return false;
    }
}

class FaceFilter implements Filter{
    @Override
    public boolean doFilter(Msg msg) {
        msg.setMsg(msg.getMsg().replace("：", "^V^"));
        return true;
    }
}

class URLFilter implements Filter{
    @Override
    public boolean doFilter(Msg msg) {
        msg.setMsg(msg.getMsg().replace("sanshi.ltd", "http://www/sanshi.ltd"));
        return true;
    }
}

/**
 * 责任链模式
 */
class FilterChina implements Filter{

    List<Filter> filters = new ArrayList<>();

    public FilterChina add(Filter filter){
        filters.add(filter);
        return this;
    }

    public boolean doFilter(Msg msg){
        for (Filter filter : filters){
            if(!filter.doFilter(msg)){
                return false;
            }
        }
        return true;
    }
}